package com.baizhi.service.impl;
import com.baizhi.entity.CountBySex;
import com.baizhi.mapper.CmfzUserDao;
import com.baizhi.entity.CmfzUser;
import com.baizhi.service.CmfzUserService;
import com.baizhi.util.ThreadPollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
@Service
public class CmfzUserServiceImpl implements CmfzUserService {


@Autowired
private CmfzUserDao cmfzUserDao;
    Logger logger= LoggerFactory.getLogger(CmfzUserServiceImpl.class);
    @Override
    public Page<CmfzUser> selectAll(Integer page, Integer limit, String userTelphone) {
        /*
        * 日志打印可以根据信息重要程序的不同  使用不同的日志级别
        * 在项目中 写日志打印的时候 一般都是用 debug info
        *
        * 在项目上线之后如果不想看到这些信息  只需要把包的日志等级 调整到warn 或者error即可
        *  屏蔽掉所有debug 和info的信息
        *
        * error 异常处理中使用
        *
        * 大于等于包等级的都能够打印
        *
        * */

        logger.debug("分页查询用户表");
        logger.info("分页查询用户表");
        logger.warn("分页查询用户表");
        logger.error("分页查询用户表");
        if (userTelphone==null){
            Page<CmfzUser> guruPage =
                    cmfzUserDao.selectPage(new Page<CmfzUser>(page, limit), null);
            return guruPage;
        }else {
            QueryWrapper<CmfzUser> queryWrapper = new QueryWrapper<>();
//       将 where nickname = zhangsan 等值查询 这个条件封装到 条件构造器
            queryWrapper.like("user_telphone", userTelphone);
            Page<CmfzUser> guruPage =
                    cmfzUserDao.selectPage(new Page<CmfzUser>(page, limit), queryWrapper);
            return guruPage;
        }
    }

    public int updateUserStatus(CmfzUser cmfzUser) {
        logger.debug("更新用户状态");
        logger.info("更新用户状态");
        logger.warn("更新用户状态");
        logger.error("更新用户状态");
        UpdateWrapper<CmfzUser> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("user_status", cmfzUser.getUserStatus());
        updateWrapper.eq("user_id", cmfzUser.getUserId());
        int update = cmfzUserDao.update(null, updateWrapper);
        return update;
    }

    @Override
    public List<Integer> selectCountBySex() {
        logger.debug("查询男女比例");
        logger.info("查询男女比例");
        logger.warn("查询男女比例");
        logger.error("查询男女比例");
        List<CountBySex> list = cmfzUserDao.selectCountBySex();
        List<Integer> integers=new ArrayList<>();
        for (CountBySex countBySex : list) {
            integers.add(countBySex.getCount());
        }
        return integers;
    }

    @Override
    public List selectCountByProvince() {
        logger.debug("中国地图中各省用户分布");
        logger.info("中国地图中各省用户分布");
        logger.warn("中国地图中各省用户分布");
        logger.error("中国地图中各省用户分布");
        List<Map> list = cmfzUserDao.selectCountByProvince();
        return list;
    }

    @Override
    public Map selectCountByDay() {
        logger.debug("每个星期用户的注册量");
        logger.info("每个星期用户的注册量");
        logger.warn("每个星期用户的注册量");
        logger.error("每个星期用户的注册量");
        Map map =new HashMap();
        //第一周注册量
        int one = cmfzUserDao.selectCountByDay(0, 7);
        //第二周注册量
        int two = cmfzUserDao.selectCountByDay(7, 14);
        //第三周注册量
        int three = cmfzUserDao.selectCountByDay(14, 21);
        map.put("第一周",one);
        map.put("第二周",two);
        map.put("第三周",three);

        return map;
    }

    @Override
    public Map selectAllNo() {
        logger.debug("不带优化的查询三个图表");
        logger.info("不带优化的查询三个图表");
        logger.warn("不带优化的查询三个图表");
        logger.error("不带优化的查询三个图表");
        Map map=new HashMap();
        /*查询所有用户男女比例*/
        List<CountBySex> countBySexes = cmfzUserDao.selectCountBySex();
        List<Integer> integers=new ArrayList<>();
        for (CountBySex countBySex : countBySexes) {
            integers.add(countBySex.getCount());
        }
        /*查询 每个星期注册的用户数量*/
        int one = cmfzUserDao.selectCountByDay(0, 7);
        int two = cmfzUserDao.selectCountByDay(7, 14);
        int three = cmfzUserDao.selectCountByDay(14, 21);
        Map map1=new HashMap();
        map1.put("第一周",one);
        map1.put("第二周",two);
        map1.put("第三周",three);
        /*中国地图*/
        List<Map> maps = cmfzUserDao.selectCountByProvince();
        map.put("count",map1);
        map.put("sex",integers);
        map.put("province",maps);
        return map;
    }

    @Override
    public Map selectAllYes() throws InterruptedException {
        logger.debug("带优化的查询三个图表");
        logger.info("带优化的查询三个图表");
        logger.warn("带优化的查询三个图表");
        logger.error("带优化的查询三个图表");
        Map map=new HashMap();
        /*1.创建计数器  参数为任务数量*/
        CountDownLatch countDownLatch = new CountDownLatch(3);
        /*2.创建三个子线程执行任务*/
        ThreadPoolExecutor executor = ThreadPollUtil.executor;
        /*男女比例查询线程一*/
        executor.submit(new Runnable() {
            @Override
            public void run() {
                List<CountBySex> countBySexes = cmfzUserDao.selectCountBySex();
                List<Integer> integers=new ArrayList<>();
                for (CountBySex countBySex : countBySexes) {
                    integers.add(countBySex.getCount());
                }
                map.put("sex",integers);
                /*计数器减一*/
                countDownLatch.countDown();
            }
        });
        /*每周用户注册量 线程二*/
        executor.submit(new Runnable() {
            @Override
            public void run() {
                int one = cmfzUserDao.selectCountByDay(0, 7);
                int two = cmfzUserDao.selectCountByDay(7, 14);
                int three = cmfzUserDao.selectCountByDay(14, 21);
                Map map1 = new HashMap();
                map1.put("第一周",one);
                map1.put("第二周",two);
                map1.put("第三周",three);
                map.put("count",map1);
                /*计数器减一*/
                countDownLatch.countDown();
            }
        });
        /* 中国地图   线程三*/
        executor.submit(new Runnable() {
            @Override
            public void run() {
                List<Map> maps = cmfzUserDao.selectCountByProvince();
                map.put("province",maps);
                countDownLatch.countDown();
            }
        });
        /*3.通过计数器让主线程等待*/
        countDownLatch.await();
        /*4.return*/
        return map;
    }
}
